home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / games / km21 / src / mainsys.c < prev    next >
C/C++ Source or Header  |  1999-12-05  |  31KB  |  1,692 lines

  1. /*sys?
  2.     mainsys
  3.  
  4. by 電魔団\shoryu 1998,99
  5. */
  6.  
  7.  
  8. #include    <stdio.h>
  9. #include    <stdlib.h>
  10. #include    <mouse.h>
  11. #include    <iocslib.h>
  12. #include    <doslib.h>
  13. #include    <math.h>
  14. #include    <graph.h>
  15. #include    <mouse.h>
  16. #include    <string.h>
  17.  
  18. #include    <zmusic.h>
  19.  
  20. #include    "STRUCTS.INC"
  21.  
  22.  
  23. DEVICE    Dev,oDev,sDev;        //入力情報
  24.  
  25. TASK    nTask;            //ワーククリア用空ダミータスク
  26. ESTASK    nesTask;        // Human Xファイルはこの領域を0クリアしてから動く
  27. PSTASK    npsTask;        //
  28.  
  29. TASK    PTask[2];        //プレーヤー
  30. TASK    MTask[MAX_MTASK];    //管理タスク(ステージ管理/編隊等)
  31. TASK    ETask[MAX_ETASK];    //敵
  32. TASK    ITask[MAX_ITASK];    //アイテム・演出物
  33. ESTASK    ESTask[MAX_ESTASK];    //敵弾
  34. PSTASK    PSTask[MAX_PSTASK];    //自機弾
  35.  
  36. int    scoreHI;        //ハイスコア
  37. int    score1P;        //得点        @@いま、1Pオンリー
  38. int    left1P;            //残機
  39.  
  40. int    vwait;            //V-Sync待ち(0=する/1=しない)
  41. int    shtmod;            //隠しシューティングモード???
  42. int    bigmod;            //隠し巨大モード???
  43. int    sortFlag=0;        //キャラクタソート1=する/0=しない
  44. int    dipSwitch;        //ディップスイップ
  45.  
  46.  
  47. //------------------------------ゲーム固有
  48.  
  49. //                外部
  50. #include    "stepman.inc"
  51. int    gameStep=STEP_INIT_ALL;
  52. int    gameLevel;
  53. int    gameTotalCounter=0;
  54. int    SyncMan__dispPage=0;
  55.  
  56.  
  57.  
  58. extern    int    StepMan();
  59.  
  60.  
  61. int    main(argc,argv)
  62. int    argc;
  63. char    *argv[];
  64. {
  65.     int    ssp;
  66.  
  67.     InitAllUser(argc,argv);
  68.     ssp=B_SUPER(0);
  69.     InitAllSuper(argc,argv);
  70.  
  71.     while( gameStep!=STEP_EXIT ){
  72.         DevMan();
  73.         StepMan();    if( gameStep==STEP_EXIT ){ break; }
  74.         TaskMan();    if( gameStep==STEP_EXIT ){ break; }
  75. //        HitchkMan0();
  76.         if( sortFlag==1 ){    SyncManY();    }
  77.         else{            SyncMan();    }
  78.  
  79. //        /**/if( Dev.kb[0x0e]&0x01 )getch();
  80.     }
  81.  
  82.     TermSuper();
  83.     B_SUPER(ssp);
  84.     TermUser();
  85.  
  86.     exit(0);
  87. }
  88.  
  89.  
  90.  
  91. int    InitAllUser(argc,argv)
  92. int    argc;
  93. char    *argv[];
  94. {
  95.     {
  96.         int    ac;
  97.         for( ac=1; ac<argc; ac++ ){ ;
  98.         if( argv[ac][0]=='-' || argv[ac][0]=='/' ){ ;
  99.         switch( argv[ac][1] ){
  100.             case 'v': case 'V':
  101.                 vwait=1;
  102.             break;
  103.             case 's': case 'S':
  104.                 sortFlag=0;
  105.             break;
  106.             case 't': case 'T':
  107.                 shtmod=1;
  108.             break;
  109.             case 'd': case 'D':
  110.                 sscanf(&argv[ac][2],"%x",&dipSwitch);
  111.             break;
  112.         }}}
  113.     }
  114.  
  115.     screen(1,3,1,1);
  116.     OS_CUROF();
  117.     cls();
  118. //    system("pic km21back.pic");
  119.     CRTMOD(270);
  120. //    HOME(0,0,256);
  121.     apic_load("km21back.pic",0,0);
  122. //    HOME(0,0,0);
  123.     APAGE(0x0f);
  124.  
  125.  
  126.     
  127. //    screen(0,1,1,1);            //16,256,4
  128.  
  129.     sp_init();
  130.  
  131.     TNUM__Init();
  132.  
  133.     spfile_def("KM21.SP",0x00);        //スプライト読み込み
  134.     palfile_def("KM21.PAL",0x01);
  135.  
  136.     sp_disp(1);
  137.     sp_on(0,127);
  138.     v_priority("TSG","0123");
  139.  
  140.     mouse(4);mouse(2);
  141.     SOUND_CALL(0);
  142.     AllTaskFree();
  143. }
  144.  
  145.  
  146. int    InitAllSuper(argc,argv)
  147. int    argc;
  148. char    *argv[];
  149. {
  150.     extern    int    TNUM__Init(),TNUM__Print();
  151.  
  152.     {    //画面上半分を下半分にコピー
  153.         unsigned short *s,*d;
  154.         s=0xC00000;
  155.         d=0xC40000;
  156.         while( s<0xC40000 ){
  157.             *d++=*s++;
  158.         }
  159.     }
  160.     {
  161.         short    *vctrl_r2=0xe8260;
  162.         *vctrl_r2|=0x1f;
  163.     }
  164. /*
  165.     {
  166.         unsigned short    *vram,mask=0xfffe;
  167.         for( vram=0xc00000; vram<0xc80000; vram++ ){
  168.             *vram&=mask;
  169.         }
  170.     }
  171. */
  172. }
  173.  
  174.  
  175.  
  176. int    TermSuper()
  177. {
  178.     short    *vram,z=0;
  179.  
  180.     for( vram=0xe00000; vram<0xe80000; vram++ ){
  181.         *vram=z;
  182.     }
  183. }
  184.  
  185.  
  186.  
  187. int    TermUser()
  188. {
  189.     SOUND_CALL(0x800);
  190.     mouse(0);
  191.     OS_CURON();
  192.     KFLUSHIO(0xff);
  193.     screen(2,0,1,1);
  194. }
  195.  
  196.  
  197.  
  198. //----------------------------------------------------------------------- DevMan()
  199.  
  200. int    DevMan()
  201. {
  202.     int    kg,b,kb;
  203.  
  204.     oDev=Dev;        //入力更新
  205.  
  206.     //キーボード
  207.     for( kg=0;kg<=0x0f;kg++ ){
  208.         Dev.kb[kg]=BITSNS(kg);
  209.         sDev.kb[kg]=0;
  210.         for( b=0;b<8;b++ ){
  211.             kb=1<<b;
  212.             if( !(oDev.kb[kg]&kb) && (Dev.kb[kg]&kb) ){
  213.                 sDev.kb[kg]|=kb;
  214.             }
  215.         }
  216.     }
  217.  
  218.     //マウス
  219.     msstat(&(Dev.mdx),&(Dev.mdy),&(Dev.mbl),&(Dev.mbr));
  220.     mspos(&(Dev.mx),&(Dev.my));
  221.     sDev.mbl=( oDev.mbl!=-1 && Dev.mbl==-1 )?-1:0;
  222.     sDev.mbr=( oDev.mbr!=-1 && Dev.mbr==-1 )?-1:0;
  223.  
  224.     //ジョイスティック
  225.     Dev.stick=stick(1);
  226.     Dev.strigA=(strig(1)&0x01);
  227.     Dev.strigB=(strig(1)&0x02);
  228.     sDev.strigA=( oDev.strigA==0 && Dev.strigA==1 )?1:0;
  229.     sDev.strigB=( oDev.strigB==0 && Dev.strigB==1 )?1:0;
  230.  
  231.  
  232.     //@@いんちきキースティック
  233. #if 0
  234.     if( Dev.kb[0x08]&0x08 ){    Dev.stick=7;    }
  235.     if( Dev.kb[0x08]&0x10 ){    Dev.stick=8;    }
  236.     if( Dev.kb[0x08]&0x20 ){    Dev.stick=9;    }
  237.  
  238.     if( Dev.kb[0x08]&0x80 ){    Dev.stick=4;    }
  239.     if( Dev.kb[0x09]&0x02 ){    Dev.stick=6;    }
  240.  
  241.     if( Dev.kb[0x09]&0x08 ){    Dev.stick=1;    }
  242.     if( Dev.kb[0x09]&0x10 ){    Dev.stick=2;    }
  243.     if( Dev.kb[0x09]&0x20 ){    Dev.stick=3;    }
  244.     
  245.     if( Dev.kb[0x0A]&0x20 ){    Dev.strig=1;    }
  246. #endif
  247. }
  248.  
  249.  
  250.  
  251.  
  252. int    voffWait()
  253. {
  254.     volatile unsigned char    *gpip=0xe88001;
  255.  
  256.     while((*gpip&0x10));
  257. }
  258.  
  259.  
  260. int    vonWait()
  261. {
  262.     volatile unsigned char    *gpip=0xe88001;
  263.  
  264.     while(!(*gpip&0x10));
  265. }
  266.  
  267.  
  268.  
  269.  
  270.  
  271. //----------------------------------------------------------------------SyncMan()
  272.  
  273. #define        X6sp_set(pl,x,y,n,p)        \
  274.         X6sync_buf[(pl)*4+0]=(x);    \
  275.         X6sync_buf[(pl)*4+1]=(y);    \
  276.         X6sync_buf[(pl)*4+2]=(n);    \
  277.         X6sync_buf[(pl)*4+3]=(p)
  278.  
  279. short    X6sync_buf[128*4];
  280. int    SyncMan()
  281. {
  282. static FIX32    cnt=0;
  283.     short    d,sppl;
  284.     d=(SyncMan__dispPage==0)?256:0;
  285.  
  286.     {//スプライト
  287.         short    tn,sn,an,px,py,pat;
  288.         TASK    *t;            //通常タスク
  289.         ESTASK    *e;            //敵弾
  290.         PSTASK    *m;            //
  291.  
  292.         SPINFO    *s;
  293.  
  294.         sppl=0;
  295.         //プレイヤー
  296.         for( tn=0;tn<=1;tn++ ){
  297.             t=&PTask[tn];
  298.             if( t->func_addr==NULL ){    continue; }
  299. //            if( t->delay_timer>0 ){        continue; }
  300.             s=t->disp0_addr;
  301.             if( s==NULL ){            continue; }
  302.             //以下、表示
  303.             an=t->disp0_anim;
  304.             px=*(short *)&(t->disp0_x);
  305.             py=*(short *)&(t->disp0_y);
  306.             for( sn=0;sn<s->anim_info[t->disp0_anim]->chips;sn++ ){
  307.                 px+=s->anim_info[t->disp0_anim]->splink[sn].ox;
  308.                 py+=s->anim_info[t->disp0_anim]->splink[sn].oy;
  309.                 pat=s->anim_info[t->disp0_anim]->splink[sn].patnum;
  310.                 if( t->disp0_palet!=0 ){
  311.                     pat&=0xf0ff;
  312.                     pat=pat|(t->disp0_palet<<8);
  313.                 }
  314.                 X6sp_set(sppl,px,py,pat,3);
  315.                 sppl++;
  316.             }
  317.         }
  318.  
  319.         //敵機
  320.         for( tn=0;tn<MAX_ETASK;tn++ ){
  321.             t=&ETask[tn];
  322.             if( t->func_addr==NULL ){    continue; }
  323. //            if( t->delay_timer>0 ){        continue; }
  324.             s=t->disp0_addr;
  325.             if( s==NULL ){            continue; }
  326.             //以下、表示
  327.             an=t->disp0_anim;
  328.             px=*(short *)&(t->disp0_x);
  329.             py=*(short *)&(t->disp0_y);
  330.             for( sn=0;sn<s->anim_info[t->disp0_anim]->chips;sn++ ){
  331.                 px+=s->anim_info[t->disp0_anim]->splink[sn].ox;
  332.                 py+=s->anim_info[t->disp0_anim]->splink[sn].oy;
  333.  
  334.                 pat=s->anim_info[t->disp0_anim]->splink[sn].patnum;
  335.                 if( t->disp0_palet!=0 ){
  336.                     pat&=0xf0ff;
  337.                     pat=pat|(t->disp0_palet<<8);
  338.                 }
  339.  
  340.                 X6sp_set(
  341.                     sppl,            //実際に描画されるSPプレーン
  342.                     px,
  343.                     py,
  344.                     pat,
  345.                     3
  346.                 );
  347.  
  348.                 sppl++;
  349.             }
  350.         }
  351.  
  352.  
  353.         //アイテム等
  354.         for( tn=0;tn<MAX_ITASK;tn++ ){
  355.             t=&ITask[tn];
  356.             if( t->func_addr==NULL ){    continue; }
  357. //            if( t->delay_timer>0 ){        continue; }
  358.             s=t->disp0_addr;
  359.             if( s==NULL ){            continue; }
  360.             //以下、表示
  361.             an=t->disp0_anim;
  362.             px=*(short *)&(t->disp0_x);
  363.             py=*(short *)&(t->disp0_y);
  364.             for( sn=0;sn<s->anim_info[t->disp0_anim]->chips;sn++ ){
  365.                 px+=s->anim_info[t->disp0_anim]->splink[sn].ox;
  366.                 py+=s->anim_info[t->disp0_anim]->splink[sn].oy;
  367.                 pat=s->anim_info[t->disp0_anim]->splink[sn].patnum;
  368.                 if( t->disp0_palet!=0 ){
  369.                     pat&=0xf0ff;
  370.                     pat=pat|(t->disp0_palet<<8);
  371.                 }
  372.                 X6sp_set(sppl,px,py,pat,3);
  373.                 sppl++;
  374.             }
  375.         }
  376.  
  377.  
  378.         //敵弾用(1チップ限定)
  379.         for( tn=0;tn<MAX_ESTASK;tn++ ){
  380.             e=&ESTask[tn];
  381.             if( e->func_addr==NULL ){    continue; }
  382. //            if( e->delay_timer>0 ){        continue; }
  383.             s=e->disp0_addr;
  384.             if( s==NULL ){            continue; }
  385.             //以下、表示
  386.             an=e->disp0_anim;
  387.             px=*(short *)&(e->disp0_x);
  388.             py=*(short *)&(e->disp0_y);
  389.             sn=0;
  390.             px+=s->anim_info[e->disp0_anim]->splink[sn].ox;
  391.             py+=s->anim_info[e->disp0_anim]->splink[sn].oy;
  392.             pat=s->anim_info[t->disp0_anim]->splink[sn].patnum;
  393.             if( t->disp0_palet!=0 ){
  394.                 pat&=0xf0ff;
  395.                 pat=pat|(t->disp0_palet<<8);
  396.             }
  397.             X6sp_set(sppl,px,py,pat,3);
  398.             sppl++;
  399.         }
  400.  
  401.         //自機用(1チップ限定)
  402.         for( tn=0;tn<MAX_PSTASK;tn++ ){
  403.             m=&PSTask[tn];
  404.             if( m->func_addr==NULL ){    continue; }
  405. //            if( m->delay_timer>0 ){        continue; }
  406.             s=m->disp0_addr;
  407.             if( s==NULL ){            continue; }
  408.             //以下、表示
  409.             an=m->disp0_anim;
  410.             px=*(short *)&(m->disp0_x);
  411.             py=*(short *)&(m->disp0_y);
  412.             sn=0;
  413.             px+=s->anim_info[an]->splink[sn].ox;
  414.             py+=s->anim_info[an]->splink[sn].oy;
  415.             pat=s->anim_info[an]->splink[sn].patnum;
  416.             if( t->disp0_palet!=0 ){
  417.                 pat&=0xf0ff;
  418.                 pat=pat|(t->disp0_palet<<8);
  419.             }
  420.             X6sp_set(sppl,px,py,pat,3);
  421.             sppl++;
  422.         }
  423.     }
  424.  
  425.  
  426.     if( vwait==0 ){ voffWait(); }
  427.     //スクロール
  428.     {
  429.         int    pn;
  430.         unsigned short    *spscr=0xEB0000,
  431.                 *sync=X6sync_buf;
  432. //cls();printf("%d",sppl);
  433.         for( pn=0;pn<min(sppl,128);pn++ ){
  434.             *spscr++=(*sync+16);sync++;
  435.             *spscr++=(*sync+16);sync++;
  436.             *spscr++=*sync++;
  437.             *spscr++=*sync++;
  438.         }
  439.  
  440.         sp_off(sppl,127);
  441.     }
  442.     if( vwait==0 ){ vonWait(); }
  443.     
  444.  
  445. }
  446.  
  447.  
  448.  
  449. TASK    *sortbuf[256][MAX_ETASK+1];
  450. TASK    **sortline[256];
  451.  
  452. /*
  453.     (今のところ敵機のみ)Y座標表示ソート付きSyncMan
  454.  
  455.     プレイヤーの優先順位を最下位に
  456. */
  457. int    SyncManY()
  458. {
  459.     static FIX32    cnt=0;
  460.     short    d,sppl;
  461.  
  462.     {//スプライト
  463.         short    tn,sn,an,px,py,pat;
  464.         short    sx,sy;
  465.         TASK    *t;            //通常タスク
  466.         ESTASK    *e;            //敵弾
  467.         PSTASK    *m;            //
  468.  
  469.         SPINFO    *s;
  470.         SPLINK    *l;
  471.         
  472.         sppl=0;
  473.         //敵機のソート
  474.         for( tn=0; tn<256; tn++ ){
  475.             sortbuf[tn][0]=0;
  476.             sortline[tn]=sortbuf[tn];
  477.         }
  478.         for( tn=0;tn<MAX_ETASK;tn++ ){
  479.             t=&ETask[tn];
  480.             if( t->func_addr==NULL ){    continue; }
  481.             s=t->disp0_addr;
  482.             if( s==NULL ){            continue; }
  483.             py=*(short *)&(t->disp0_y);
  484.             if( py>=0 && py<255 ){
  485.                 *sortline[py]++=t;
  486.                 *sortline[py]=0;
  487.             }
  488.         }
  489.         
  490.         //敵機
  491.         for( sy=255; sy>=0; sy-- ){ ; for( sx=0; sx<32; sx++ ){
  492.             t=sortbuf[sy][sx];
  493.             if( t==0 ){ break; }
  494. //            if( t->func_addr==NULL ){    continue; }
  495.             s=t->disp0_addr;
  496.             if( s==NULL ){            continue; }
  497.             //以下、表示
  498.             an=t->disp0_anim;
  499.             px=*(short *)&(t->disp0_x);
  500.             py=*(short *)&(t->disp0_y);
  501.             for( sn=0;sn<s->anim_info[an]->chips;sn++ ){
  502. /*
  503.                 px+=s->anim_info[an]->splink[sn].ox;
  504.                 py+=s->anim_info[an]->splink[sn].oy;
  505.                 pat=s->anim_info[an]->splink[sn].patnum;
  506. */
  507.                 l=&(s->anim_info[an]->splink[sn]);
  508.                 px+=l->ox;
  509.                 py+=l->oy;
  510.                 pat=l->patnum;
  511.                 if( t->disp0_palet!=0 ){
  512.                     pat&=0xf0ff;
  513.                     pat=pat|(t->disp0_palet<<8);
  514.                 }
  515.                 X6sp_set(sppl,px,py,pat,3);
  516.  
  517.                 sppl++;
  518.             }
  519.         }}
  520.  
  521.         //アイテム等
  522.         for( tn=0;tn<MAX_ITASK;tn++ ){
  523.             t=&ITask[tn];
  524.             if( t->func_addr==NULL ){    continue; }
  525. //            if( t->delay_timer>0 ){        continue; }
  526.             s=t->disp0_addr;
  527.             if( s==NULL ){            continue; }
  528.             //以下、表示
  529.             an=t->disp0_anim;
  530.             px=*(short *)&(t->disp0_x);
  531.             py=*(short *)&(t->disp0_y);
  532.             for( sn=0;sn<s->anim_info[t->disp0_anim]->chips;sn++ ){
  533.                 l=&(s->anim_info[t->disp0_anim]->splink[sn]);
  534.                 px+=l->ox;
  535.                 py+=l->oy;
  536.                 pat=l->patnum;
  537.                 if( t->disp0_palet!=0 ){
  538.                     pat&=0xf0ff;
  539.                     pat=pat|(t->disp0_palet<<8);
  540.                 }
  541.                 X6sp_set(sppl,px,py,pat,3);
  542.                 sppl++;
  543.             }
  544.         }
  545.  
  546.  
  547.         //敵弾用(1チップ限定)
  548.         for( tn=0;tn<MAX_ESTASK;tn++ ){
  549.             e=&ESTask[tn];
  550.             if( e->func_addr==NULL ){    continue; }
  551. //            if( e->delay_timer>0 ){        continue; }
  552.             s=e->disp0_addr;
  553.             if( s==NULL ){            continue; }
  554.             //以下、表示
  555.             an=e->disp0_anim;
  556.             px=*(short *)&(e->disp0_x);
  557.             py=*(short *)&(e->disp0_y);
  558.             sn=0;
  559.             l=&(s->anim_info[an]->splink[sn]);
  560.             px+=l->ox;
  561.             py+=l->oy;
  562.             pat=l->patnum;
  563.             if( t->disp0_palet!=0 ){
  564.                 pat&=0xf0ff;
  565.                 pat=pat|(t->disp0_palet<<8);
  566.             }
  567.             X6sp_set(sppl,px,py,pat,3);
  568.             sppl++;
  569.         }
  570.  
  571.         //自機弾用(1チップ限定)
  572.         for( tn=0;tn<MAX_PSTASK;tn++ ){
  573.             m=&PSTask[tn];
  574.             if( m->func_addr==NULL ){    continue; }
  575. //            if( m->delay_timer>0 ){        continue; }
  576.             s=m->disp0_addr;
  577.             if( s==NULL ){            continue; }
  578.             //以下、表示
  579.             an=m->disp0_anim;
  580.             px=*(short *)&(m->disp0_x);
  581.             py=*(short *)&(m->disp0_y);
  582.             sn=0;
  583.             l=&(s->anim_info[an]->splink[sn]);
  584.             px+=l->ox;
  585.             py+=l->oy;
  586.             pat=l->patnum;
  587.             if( t->disp0_palet!=0 ){
  588.                 pat&=0xf0ff;
  589.                 pat=pat|(t->disp0_palet<<8);
  590.             }
  591.             X6sp_set(sppl,px,py,pat,3);
  592.             sppl++;
  593.         }
  594.  
  595.         //プレイヤー
  596.         for( tn=0;tn<=1;tn++ ){
  597.             t=&PTask[tn];
  598.             if( t->func_addr==NULL ){    continue; }
  599. //            if( t->delay_timer>0 ){        continue; }
  600.             s=t->disp0_addr;
  601.             if( s==NULL ){            continue; }
  602.             //以下、表示
  603.             an=t->disp0_anim;
  604.             px=*(short *)&(t->disp0_x);
  605.             py=*(short *)&(t->disp0_y);
  606.             for( sn=0;sn<s->anim_info[an]->chips;sn++ ){
  607.                 l=&(s->anim_info[an]->splink[sn]);
  608.                 px+=l->ox;
  609.                 py+=l->oy;
  610.                 pat=l->patnum;
  611.                 if( t->disp0_palet!=0 ){
  612.                     pat&=0xf0ff;
  613.                     pat=pat|(t->disp0_palet<<8);
  614.                 }
  615.                 X6sp_set(sppl,px,py,pat,3);
  616.                 sppl++;
  617.             }
  618.         }
  619.  
  620.     }
  621.  
  622.  
  623.     if( vwait==0 ){ voffWait(); }
  624.     //スクロール
  625.     {
  626.         int    pn;
  627.         unsigned short    *spscr=0xEB0000,
  628.                 *sync=X6sync_buf;
  629.         for( pn=0;pn<min(sppl,128);pn++ ){
  630.             *spscr++=(*sync+16);sync++;
  631.             *spscr++=(*sync+16);sync++;
  632.             *spscr++=*sync++;
  633.             *spscr++=*sync++;
  634.         }
  635.  
  636.         sp_off(sppl,127);
  637.     }
  638.     if( vwait==0 ){ vonWait(); }
  639.     
  640.  
  641. }
  642.  
  643.  
  644.  
  645.  
  646. /*
  647.     sにはかならず32768byteのバッファを指定
  648. */
  649. int    SetX6Pcgbuf(addr)
  650. unsigned short *addr;
  651. {
  652.     unsigned short *s,*d=0xEB8000;
  653.     int    cnt;
  654.  
  655.     s=addr;
  656.     for( cnt=0;cnt<(32768/2);cnt++ ){
  657.         *d++=*s++;
  658.     }
  659.  
  660.     return(0);
  661. }
  662.  
  663.  
  664.  
  665.  
  666. int    SetX6Palbuf(addr)
  667. unsigned short *addr;
  668. {
  669.     unsigned short *s,*d=0xE82220;
  670.     int    cnt;
  671.  
  672.     s=addr;
  673.     for( cnt=0;cnt<240;cnt++ ){
  674.         *d++=*s++;
  675.     }
  676. //    tbg_newpalet();
  677.     return(0);
  678. }
  679.  
  680.  
  681.  
  682.  
  683. //----------------------------------------------------------------------TaskMan()
  684.  
  685.  
  686. /*@@ 重要 @@
  687.     現在のTaskManの仕様変更、
  688.     
  689.         ・確保(Alloc)時には、ワークアドレスを返すだけ
  690.         ・解放(Free)時に、タスクワークを0クリア
  691. */
  692.  
  693.  
  694.  
  695.  
  696. /*
  697. */
  698.  
  699. int    TaskMan__allfreeFlag;            //1=allTaskFreeを実行した
  700.  
  701. int    TaskMan()
  702. {
  703.     short    tn;
  704.     TASK    *t;
  705.     ESTASK    *es;
  706.     PSTASK    *ps;
  707.     int    (*func)(),ot;
  708.  
  709.     /*                    管理タスク        */
  710. /*
  711. 自分のなかでAllTaskFreeし、自分を再登録すると
  712. 同じ(昔自分がいた)ワークエリアにもう一度自分を作ることがある。
  713. すると、t->func_addrは一見、何事もなかったような状態になる
  714. (→MTaskが1つだけの時、AllTaskFreeした直後MTaskを確保した時なんかになる。
  715. しかし、一回AllTaskFreeしているので、->local_counterは0になる)
  716. @@これおかしい。というかタイミングがあわない場合もある。
  717. */
  718.     for( tn=0;tn<MAX_MTASK;tn++ ){
  719.         t=&MTask[tn];
  720.         if( t->func_addr==NULL ){ continue; }
  721.         if( t->delay_timer>0 ){ t->delay_timer--; continue; }
  722.         func=t->func_addr;
  723.         ot=t->local_counter;
  724.         func(t);
  725.         if( t->func_addr ){    //自分のなかでTaskFreeしかたチェック
  726.             if( ot!=t->local_counter ){
  727.                 t->local_counter=0;    //念のため
  728.             }
  729.             else{
  730.                 t->local_counter++;
  731.             }
  732.         }
  733.     }
  734.     TaskMan__allfreeFlag=0;
  735.  
  736.     /*                    プレーヤータスク    */
  737.     for( tn=0;tn<=1;tn++ ){
  738.         t=&PTask[tn];
  739.         if( t->func_addr==NULL ){ continue; }
  740.         if( t->delay_timer>0 ){
  741.             t->delay_timer--;
  742.             continue;
  743.         }
  744.         //以下、AllocしたTASKを走らせる
  745.         func=t->func_addr;
  746.         func(t);
  747.         if( t->func_addr ){ t->local_counter++; }
  748.     }
  749.  
  750.     /*                    敵タスク        */
  751.     for( tn=0;tn<MAX_ETASK;tn++ ){
  752.         t=&ETask[tn];
  753.         if( t->func_addr==NULL ){ continue; }
  754.         if( t->delay_timer>0 ){ t->delay_timer--; continue; }
  755.         func=t->func_addr;
  756.         func(t);
  757.         if( t->func_addr ){    //func(t)でETaskFreeした場合を考慮
  758.             t->local_counter++;
  759.         }
  760.     }
  761.  
  762.     /*                    アイテム等タスク    */
  763.     for( tn=0;tn<MAX_ITASK;tn++ ){
  764.         t=&ITask[tn];
  765.         if( t->func_addr==NULL ){ continue; }
  766.         if( t->delay_timer>0 ){ t->delay_timer--; continue; }
  767.         func=t->func_addr;
  768.         func(t);
  769.         if( t->func_addr ){ t->local_counter++; }
  770.     }
  771.  
  772.     /*                    敵弾            */
  773.     for( tn=0;tn<MAX_ESTASK;tn++ ){
  774.         es=&ESTask[tn];
  775.         if( es->func_addr==NULL ){ continue; }
  776.         if( es->delay_timer>0 ){ es->delay_timer--; continue; }
  777.         func=es->func_addr;
  778.         func(es);
  779.     }
  780.  
  781.     /*                    自機弾            */
  782.     for( tn=0;tn<MAX_PSTASK;tn++ ){
  783.         ps=&PSTask[tn];
  784.         if( ps->func_addr==NULL ){ continue; }
  785.         func=ps->func_addr;
  786.         func(ps);
  787.     }
  788.  
  789. //    IdleTask();        //@@いらんくらい
  790.  
  791.     return( (gameStep==STEP_EXIT)?-1:0 );
  792. }
  793.  
  794.  
  795. /*
  796. */
  797. int    AllTaskFree()
  798. {
  799.     short    ct;
  800.     
  801.     PTask[0]=nTask;        //プレーヤー
  802.     PTask[1]=nTask;
  803.     for( ct=0;ct<MAX_ETASK;ct++ ){    ETask[ct]=nTask;    }//敵タスク
  804.     for( ct=0;ct<MAX_MTASK;ct++ ){    MTask[ct]=nTask;    }//管理タスク
  805.     for( ct=0;ct<MAX_ITASK;ct++ ){    ITask[ct]=nTask;    }//アイテムタスク
  806.  
  807.     for( ct=0;ct<MAX_ESTASK;ct++ ){    ESTask[ct]=nesTask;    }//敵弾
  808.     for( ct=0;ct<MAX_PSTASK;ct++ ){    PSTask[ct]=npsTask;    }//自機弾
  809.  
  810.     TaskMan__allfreeFlag=1;
  811.     
  812.     return(0);
  813. }
  814.  
  815.  
  816.  
  817. /*
  818. */
  819. int    AllETaskFree()
  820. {
  821.     short    ct;
  822.  
  823.     for( ct=0;ct<MAX_ETASK;ct++ ){    ETask[ct]=nTask;    }//敵タスク
  824.  
  825.     return(0);
  826. }
  827.  
  828.  
  829.  
  830. int    AllESTaskFree()
  831. {
  832.     short    ct;
  833.  
  834.     for( ct=0;ct<MAX_ESTASK;ct++ ){    ESTask[ct]=nesTask;    }//敵弾
  835.     
  836.     return(0);
  837. }
  838.  
  839.  
  840.  
  841. /*
  842.     プレーヤータスク登録
  843.     RES:タスクワークアドレス、0の時確保失敗
  844. */
  845. int    *PTaskAlloc(pn)
  846. int    pn;        //0or1:プレーヤー番号
  847. {
  848.     int    *res=0;
  849.  
  850.     if( PTask[pn].func_addr==0 ){
  851.         res=&PTask[pn];
  852.     }
  853.     
  854.     return(res);
  855. }
  856.  
  857.  
  858.  
  859. /*
  860.     RES:0以外、登録したタスクワーク番号
  861. */
  862. TASK    *MTaskAlloc()
  863. {
  864.     short    ct;
  865.     TASK    *t;
  866.     
  867.     for( ct=0;ct<MAX_MTASK;ct++ ){
  868.         t=&MTask[ct];
  869.         if( t->func_addr==NULL ){    //空タスク発見
  870.             goto quick_exit;
  871.         }
  872.     }
  873.     t=0;
  874.     
  875. quick_exit:
  876.     return(t);
  877. }
  878.  
  879.  
  880.  
  881. /*
  882.     RES:0以外、確保可能なタスクアドレス
  883. */
  884. TASK    *ETaskAlloc()
  885. {
  886.     short    ct;
  887.     TASK    *t;
  888.     
  889.     for( ct=0;ct<MAX_ETASK;ct++ ){
  890.         t=&ETask[ct];
  891.         if( t->func_addr==NULL ){    //空タスク発見
  892.             goto quick_exit;
  893.         }
  894.     }
  895.     t=NULL;
  896.     
  897. quick_exit:
  898.     return(t);
  899. }
  900.  
  901.  
  902.  
  903. /*
  904.     RES:0以外、登録したタスクワーク番号
  905. */
  906. TASK    *ITaskAlloc()
  907. {
  908.     short    ct;
  909.     TASK    *t;
  910.     
  911.      for( ct=0;ct<MAX_ITASK;ct++ ){
  912.         t=&ITask[ct];
  913.         if( t->func_addr==NULL ){    //空タスク発見
  914.             goto quick_exit;
  915.         }
  916.     }
  917.     t=0;
  918.     
  919. quick_exit:
  920.     return(t);
  921. }
  922.  
  923.  
  924.  
  925. /*
  926.     RES:0以外、排除したタスクワーク番号
  927. */
  928. int    MTaskFree(task)
  929. TASK    *task;
  930. {
  931.     *task=nTask;
  932.     
  933.     return(0);
  934. }
  935.  
  936.  
  937.  
  938.  
  939. /*
  940.     RES:0以外、排除したタスクワーク番号
  941. */
  942. int    ETaskFree(task)
  943. TASK    *task;
  944. {
  945.     *task=nTask;
  946.     
  947.     return(0);
  948. }
  949.  
  950.  
  951.  
  952.  
  953. /*
  954.     RES:0以外、排除したタスクワーク番号
  955. */
  956. int    ITaskFree(task)
  957. TASK    *task;
  958. {
  959.     *task=nTask;
  960.     
  961.     return(0);
  962. }
  963.  
  964.  
  965.  
  966.  
  967.  
  968. /*
  969.     敵弾用:RES:0以外、登録したタスクワーク番号
  970. */
  971. ESTASK    *ESTaskAlloc(task)
  972. ESTASK    *task;
  973. {
  974.     short    ct;
  975.     ESTASK    *t;
  976.     
  977.     for( ct=0;ct<MAX_ESTASK;ct++ ){
  978.         t=&ESTask[ct];
  979.         if( t->func_addr==NULL ){
  980.             goto quick_exit;
  981.         }
  982.     }
  983.     t=0;
  984.     
  985. quick_exit:
  986.     return(t);
  987. }
  988.  
  989.  
  990. /*
  991.     敵弾:RES:0以外、排除したタスクワーク番号
  992. */
  993. int    ESTaskFree(task)
  994. ESTASK    *task;
  995. {
  996.     *task=nesTask;
  997.     
  998.     return(0);
  999. }
  1000.  
  1001.  
  1002. /*
  1003.     自機弾弾用:RES:0以外、登録したタスクワーク番号
  1004. */
  1005. PSTASK    *PSTaskAlloc()
  1006. {
  1007.     short    ct;
  1008.     PSTASK    *t;
  1009.     
  1010.     for( ct=0;ct<MAX_PSTASK;ct++ ){
  1011.         t=&PSTask[ct];
  1012.         if( t->func_addr==NULL ){
  1013.             goto quick_exit;
  1014.         }
  1015.     }
  1016.     t=0;
  1017.     
  1018. quick_exit:
  1019.     return(t);
  1020. }
  1021.  
  1022.  
  1023. /*
  1024.     自機弾:RES:0以外、排除したタスクワーク番号
  1025. */
  1026. int    PSTaskFree(task)
  1027. PSTASK    *task;
  1028. {
  1029.     *task=npsTask;
  1030.     
  1031.     return(0);
  1032. }
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.                                         
  1043. ////////////////////////////////////////////////////////////////////////////////
  1044. //                             hitchk.c であったトコロ
  1045. ////////////////////////////////////////////////////////////////////////////////
  1046. /*
  1047.     あたり判定(プレイヤーは1のみ)
  1048. */
  1049. /*
  1050.     単純判定(うごくだけまし)
  1051. */
  1052. int    HitchkMan0()
  1053. {
  1054.     TASK    *et,*pt;
  1055.     PSTASK    *ps;
  1056.     ESTASK    *es;
  1057.     short    en,sn;
  1058.  
  1059.     /*
  1060.         自機弾(点)vs 敵機(クケー)
  1061.     */
  1062.     for( en=0;en<MAX_ETASK;en++ ){
  1063.         et=&ETask[en];
  1064.         if( et->func_addr==NULL ){ continue; }
  1065.         for( sn=0;sn<MAX_PSTASK;sn++ ){
  1066.             ps=&PSTask[sn];
  1067.             if( ps->func_addr==NULL ){ continue; }
  1068.             if(
  1069.             (et->disp0_x+(et->hit_x0<<16) <= ps->disp0_x) &&
  1070.             (ps->disp0_x <= et->disp0_x+(et->hit_x1<<16)) &&
  1071.             (et->disp0_y+(et->hit_y0<<16) <= ps->disp0_y) &&
  1072.             (ps->disp0_y <= et->disp0_y+(et->hit_y1<<16))
  1073.             ){
  1074.                 et->task_command=TC_HIT_SHOT;    //やられコード埋め込み
  1075.                 ps->task_command=TC_HIT_ENEMY;
  1076.                 et->hit_addr=(int *)ps;
  1077. //                ps->hit_addr=(int *)et;
  1078.             }
  1079.         }
  1080.     }
  1081.  
  1082.  
  1083.     /*
  1084.         自機(クケー) vs 敵弾(点)
  1085.     */
  1086.     pt=&PTask[0];
  1087.     pt->hit_addr=0;                    //自機の対あたりクリアわすれるな
  1088.     for( sn=0;sn<MAX_ESTASK;sn++ ){
  1089.         es=&ESTask[sn];
  1090.         if( es->func_addr==NULL ){ continue; }
  1091.         if(
  1092.         (pt->disp0_x+(pt->hit_x0<<16) <= es->disp0_x) &&
  1093.         (es->disp0_x <= pt->disp0_x+(pt->hit_x1<<16)) &&
  1094.         (pt->disp0_y+(pt->hit_y0<<16) <= es->disp0_y) &&
  1095.         (es->disp0_y <= pt->disp0_y+(pt->hit_y1<<16))
  1096.         ){
  1097.             pt->task_command=TC_HIT_SHOT;    //やられ
  1098.             es->task_command=TC_HIT_PLAYER;
  1099.             pt->hit_addr=(int *)es;
  1100. //            es->hit_addr=(int *)es;        //esにhit_addrは用意しない
  1101.         }
  1102.     }
  1103.  
  1104.  
  1105.     /*
  1106.         自機(クケー) vs 敵(クケー)
  1107.     */
  1108.     pt=&PTask[0];
  1109.     if( pt->func_addr==NULL ){    goto end_ptet;    }
  1110.     if( *(int *)(&(pt->hit_x0))==0 ){    goto end_ptet;    }
  1111.     for( en=0;en<MAX_ETASK;en++ ){
  1112.         et=&ETask[en];
  1113.         if( et->func_addr==NULL ){ continue; }
  1114.         if( pt->disp0_x+(pt->hit_x0<<16) > et->disp0_x+(et->hit_x1<<16) ){ continue; }
  1115.         if( pt->disp0_x+(pt->hit_x1<<16) < et->disp0_x+(et->hit_x0<<16) ){ continue; }
  1116.         if( pt->disp0_y+(pt->hit_y0<<16) > et->disp0_y+(et->hit_y1<<16) ){ continue; }
  1117.         if( pt->disp0_y+(pt->hit_y1<<16) < et->disp0_y+(et->hit_y0<<16) ){ continue; }
  1118.         pt->task_command=TC_HIT_ENEMY;    //やられ
  1119.         et->task_command=TC_HIT_PLAYER;
  1120.         pt->hit_addr=(int *)et;
  1121.         et->hit_addr=(int *)pt;
  1122.     }
  1123. end_ptet:;
  1124.  
  1125.  
  1126.     /*
  1127.         自機(クケー) vsアイテム(クケー)
  1128.     */
  1129.     pt=&PTask[0];
  1130.     if( pt->func_addr==NULL ){    goto end_ptit;    }
  1131.     if( *(int *)(&(pt->hit_x0))==0 ){    goto end_ptit;    }
  1132.     for( en=0;en<MAX_ITASK;en++ ){
  1133.         et=&ITask[en];
  1134.         if( et->func_addr==NULL ){ continue; }
  1135.         if( *(int *)(&(et->hit_x0))==0 ){ continue; }
  1136.         if( pt->disp0_x+(pt->hit_x0<<16) > et->disp0_x+(et->hit_x1<<16) ){ continue; }
  1137.         if( pt->disp0_x+(pt->hit_x1<<16) < et->disp0_x+(et->hit_x0<<16) ){ continue; }
  1138.         if( pt->disp0_y+(pt->hit_y0<<16) > et->disp0_y+(et->hit_y1<<16) ){ continue; }
  1139.         if( pt->disp0_y+(pt->hit_y1<<16) < et->disp0_y+(et->hit_y0<<16) ){ continue; }
  1140.         pt->task_command=TC_HIT_ITEM;    //ゲット
  1141.         et->task_command=TC_HIT_PLAYER;
  1142.         pt->hit_addr=(int *)et;
  1143.         et->hit_addr=(int *)pt;
  1144.     }
  1145. end_ptit:;
  1146.  
  1147.     
  1148.     return(0);
  1149.  
  1150. }
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161. ////////////////////////////////////////////////////////////////////////////////
  1162. //                             sound.c であったトコロ
  1163. ////////////////////////////////////////////////////////////////////////////////
  1164. /*
  1165. sound.c
  1166. */
  1167. /*
  1168.     →sound000.tbl
  1169. */
  1170. /*
  1171.     基本的に音にまつわるあれこれに関する外部からの要求は、「SOUND_CALL」にのみ
  1172.     対応する。
  1173.  
  1174.     mod=0        音関係の初期設定(ファイル読み込みを含む)
  1175.  
  1176.     bit0~7        音番号
  1177.     bit8=0        PCM
  1178.     bit8=1        ZMD
  1179.     bit12=1        制御関係
  1180. */
  1181.  
  1182.  
  1183. extern    int    PCMADDR[],PCMLEN[];
  1184. extern    char    *ZMDINFO[];
  1185.  
  1186. int    SOUND_CALL(mod)
  1187. int    mod;
  1188. {
  1189.     int    res=0;
  1190.     static    int    omod,ommod;
  1191.  
  1192. //goto quick_exit;
  1193.     
  1194.     if( mod==-1 ){    //1つ前に鳴らした番号リクエスト
  1195.         res=omod;
  1196.         goto quick_exit;
  1197.     }
  1198.     if( mod==-2 ){    //1つ前に鳴らしたBGM番号リクエスト
  1199.         res=ommod;
  1200.         goto quick_exit;
  1201.     }
  1202.     
  1203.     if( mod==0 ){
  1204.         /*
  1205.             音関係の初期設定
  1206.         */
  1207.         SOUND_CALL(0x0101);    //BGM_INIT
  1208.         goto quick_exit;
  1209.     }
  1210.  
  1211.     if( mod&0x800 ){
  1212.         //制御
  1213.         m_stop(0,0, 0,0, 0,0, 0,0, 0,0);
  1214.     }
  1215.     else if( mod&0x100 ){
  1216.         //ZMD
  1217.         int    num;
  1218.         ommod=mod;
  1219.         num=mod&0xff;
  1220.         zmd_play(ZMDINFO[num]);
  1221. ///**/        cls();printf(ZMDINFO[num]);getch();
  1222.     }
  1223.     else{
  1224.         //PCM
  1225.         unsigned char *adr;
  1226.         int    len,pmod=0x0403;
  1227.         adr=PCMADDR[mod];
  1228.         len=PCMLEN[mod];
  1229.         ADPCMOUT(adr,pmod,len);
  1230.     }
  1231.  
  1232.  
  1233.     
  1234.     omod=mod;
  1235.     
  1236. quick_exit:
  1237.     return(res);
  1238.     
  1239. }
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249. ////////////////////////////////////////////////////////////////////////////////
  1250. //                                   vec10.cだった
  1251. ////////////////////////////////////////////////////////////////////////////////
  1252. /*------------------------------------------------------------------------------*/
  1253. /*
  1254.     単位ベクトルテーブル
  1255.  
  1256. 座標系
  1257.  
  1258. ┌─→+x        において、方向番号0~255は、以下に示すよう
  1259. +y
  1260.  
  1261.     192
  1262.  
  1263.  
  1264.   128┌─→+x0
  1265.      │
  1266.      ↓        (1,0)を開始点とした逆時計周りでカウントアップ
  1267.      +y
  1268.      64
  1269. */
  1270.  
  1271. typedef    struct    {
  1272.     FIX32    ivx;
  1273.     FIX32    ivy;
  1274. } IVECTOR;                //単位ベクトル(1,15,16)
  1275.  
  1276.  
  1277.  
  1278.  
  1279. /*
  1280.     (sx,sy)からみて(tx,ty)はどの方向に位置しているかを高速サーチする。
  1281.     分解能は256。(←経験則的値)これでだいたい足りるものだ
  1282.  
  1283. X68での使用での現実的な精巧サーチを実現するには2048段階必要
  1284. (画面端1ドットから画面端1ドットに当てることができる)
  1285.  
  1286.     オフセット座標からのテーブルでもかまわない(むしろそちらの方が速い)が、
  1287.     データサイズがやたらでかくなる。って、なんか、みみっちい。
  1288.  
  1289. */
  1290. unsigned short    TAN32TBL[]={
  1291.  
  1292. 0x0000,0x0648,0x0C91,0x12DF,0x1933,0x1F8E,0x25F4,0x2C65,
  1293. 0x32E5,0x3974,0x4017,0x46CE,0x4D9D,0x5486,0x5B8C,0x62B1,
  1294. 0x69FA,0x7169,0x7902,0x80C8,0x88C0,0x90EF,0x9958,0xA201,
  1295. 0xAAF1,0xB42D,0xBDBB,0xC7A5,0xD1F1,0xDCAA,0xE7D9,0xF38B
  1296.  
  1297. };
  1298.  
  1299. //方向番号を返す
  1300. short    Search256(sx,sy,tx,ty)
  1301. short    sx,sy;                //始点
  1302. short    tx,ty;                //終点
  1303. {
  1304.     short    dx,dy;            //distance
  1305.     short    rev_flag=0;        // 0000 0XHV
  1306.                     //         
  1307.     unsigned short    tandy;        //tan - dy
  1308.     
  1309.     short    phy=0;            //角度番号
  1310.     
  1311.     dx=tx-sx;
  1312.     dy=ty-sy;
  1313.     
  1314.     
  1315.     
  1316.     if( dx==0 ){
  1317.         phy=( (ty-sy)>=0 )?64:192;
  1318.         goto quick_exit;
  1319.     }
  1320.     if( dy==0 ){
  1321.         phy=( (tx-sx)>=0 )?0:128;
  1322.         goto quick_exit;
  1323.     }
  1324.     
  1325.     
  1326.     if( dy<0 ){
  1327.         dy=-dy;
  1328.         rev_flag|=0x01;
  1329.     }
  1330.     
  1331.     if( dx<0 ){
  1332.         dx=-dx;
  1333.         rev_flag|=0x02;
  1334.     }
  1335.     
  1336.     if( dy>dx ){
  1337.         int    tmp;
  1338.         tmp=dy;
  1339.         dy=dx;
  1340.         dx=tmp;
  1341.         rev_flag|=0x04;
  1342.     }
  1343.     
  1344.     //この時点でdx,dy共に+の値でdx>dyが保証される
  1345.     if( dx==dy ){
  1346.         phy=31;
  1347.         goto endSch32;
  1348.     }
  1349.     
  1350.     
  1351.     
  1352.     tandy=(unsigned short)(((int)dy<<16)/dx);
  1353.     
  1354.     if( tandy<TAN32TBL[16] ){                    //N.16=0.414213
  1355.         //N=0-15
  1356.         if( tandy<TAN32TBL[8] ){                //N.8=0.198912
  1357.             //N=0-7
  1358.             if( tandy<TAN32TBL[4] ){            //N.4
  1359.                 //N=0-3
  1360.                 if( tandy<TAN32TBL[2] ){        //N.2
  1361.                     //N=0-1
  1362.                     phy=( tandy<TAN32TBL[1] )?0:1;    //N.0or1
  1363.                 }
  1364.                 else{
  1365.                     //N=2-3
  1366.                     phy=( tandy<TAN32TBL[3] )?0:1;    //N.2or3
  1367.                 }
  1368.             }
  1369.             else{
  1370.                 //N=4-7
  1371.                 if( tandy<TAN32TBL[6] ){
  1372.                     //N=4-5
  1373.                     phy=( tandy<TAN32TBL[5] )?4:5;
  1374.                 }
  1375.                 else{
  1376.                     //N=6-7
  1377.                     phy=( tandy<TAN32TBL[7] )?6:7;
  1378.                 }
  1379.             }
  1380.         }
  1381.         else{
  1382.             //N=8-15
  1383.             if( tandy<TAN32TBL[12] ){
  1384.                 //N=8-11
  1385.                 if( tandy<TAN32TBL[10] ){
  1386.                     //N=8-9
  1387.                     phy=( tandy<TAN32TBL[9] )?8:9;
  1388.                 }
  1389.                 else{
  1390.                     //N=10-11
  1391.                     phy=( tandy<TAN32TBL[11] )?10:11;
  1392.                 }
  1393.             }
  1394.             else{
  1395.                 //N=12-15
  1396.                 if( tandy<TAN32TBL[14] ){
  1397.                     //12-13
  1398.                     phy=( tandy<TAN32TBL[13] )?12:13;
  1399.                 }
  1400.                 else{
  1401.                     //14-15
  1402.                     phy=( tandy<TAN32TBL[15] )?14:15;
  1403.                 }
  1404.             }
  1405.         }
  1406.     }
  1407.     else{
  1408.         //N=16-31
  1409.         if( tandy<TAN32TBL[24] ){
  1410.             //N=16-23
  1411.             if( tandy<TAN32TBL[20] ){
  1412.                 //N=16-19
  1413.                 if( tandy<TAN32TBL[18] ){
  1414.                     //N=16-17
  1415.                     phy=( tandy<TAN32TBL[17] )?16:17;
  1416.                 }
  1417.                 else{
  1418.                     //N=18-19
  1419.                     phy=( tandy<TAN32TBL[19] )?18:19;
  1420.                 }
  1421.             }
  1422.             else{
  1423.                 //N20-23
  1424.                 if( tandy<TAN32TBL[22] ){
  1425.                     //N=20-21
  1426.                     phy=( tandy<TAN32TBL[21] )?20:21;
  1427.                 }
  1428.                 else{
  1429.                     //N=22-23
  1430.                     phy=( tandy<TAN32TBL[23] )?22:23;
  1431.                 }
  1432.             }
  1433.         }
  1434.         else{
  1435.             //N=24-31
  1436.             if( tandy<TAN32TBL[28] ){
  1437.                 //N=24-27
  1438.                 if( tandy<TAN32TBL[26] ){
  1439.                     //N=24-25
  1440.                     phy=( tandy<TAN32TBL[25] )?24:25;
  1441.                 }
  1442.                 else{
  1443.                     //N=26-27
  1444.                     phy=( tandy<TAN32TBL[27] )?26:27;
  1445.                 }
  1446.             }
  1447.             else{
  1448.                 //N=28-31
  1449.                 if( tandy<TAN32TBL[30] ){
  1450.                     //N=28-29
  1451.                     phy=( tandy<TAN32TBL[29] )?28:29;
  1452.                 }
  1453.                 else{
  1454.                     //N=30-31
  1455.                     phy=( tandy<TAN32TBL[31] )?30:31;
  1456.                 }
  1457.             }
  1458.         }
  1459.     }
  1460.     /*
  1461.         ↑このへんはループで綺麗に書いたいいかもしれないが、
  1462.         なんとなく、全部展開しておく。気分の問題
  1463.     */
  1464. endSch32:
  1465.     
  1466.  
  1467.  
  1468.     if( rev_flag&0x04 ){    //X-flag
  1469.         phy=63-phy;
  1470.     }
  1471.  
  1472.     if( rev_flag&0x02 ){    //H-flag
  1473.         phy=127-phy;
  1474.     }
  1475.  
  1476.     if( rev_flag&0x01 ){    //V-flag
  1477.         phy=255-phy;
  1478.     }
  1479.  
  1480. quick_exit:
  1481.     return(phy);
  1482. }
  1483.  
  1484.  
  1485.  
  1486.  
  1487.  
  1488. /*
  1489.     256方向からジョイスティック8方向へ変換
  1490. */
  1491. short    D256toJ8(sdir)
  1492. short    sdir;
  1493. {
  1494.     short    jdir=0;
  1495.     if( 0<=sdir && sdir<16 ){        jdir=6;        }
  1496.     else if( 16<=sdir && sdir<48 ){        jdir=3;        }
  1497.     else if( 48<=sdir && sdir<80 ){        jdir=2;        }
  1498.     else if( 80<=sdir && sdir<112 ){    jdir=1;        }
  1499.     else if( 112<=sdir && sdir<144 ){    jdir=4;        }
  1500.     else if( 144<=sdir && sdir<176 ){    jdir=7;        }
  1501.     else if( 176<=sdir && sdir<208 ){    jdir=8;        }
  1502.     else if( 208<=sdir && sdir<240 ){    jdir=9;        }
  1503.     else if( 240<=sdir && sdir<256 ){    jdir=6;        }
  1504.  
  1505.     return(jdir);
  1506. }
  1507.  
  1508.  
  1509.  
  1510. /*
  1511. ジョイスティック8方向を返す
  1512. 使い方はSearch256とおなじ
  1513. */
  1514. short    SearchJ8(sx,sy,tx,ty)
  1515. short    sx,sy;                //始点
  1516. short    tx,ty;                //終点
  1517. {
  1518.     short    sdir,jdir;
  1519.  
  1520.     sdir=Search256(sx,sy,tx,ty);
  1521.     jdir=D256toJ8(sdir);
  1522.     
  1523.     return(jdir);
  1524. }
  1525.  
  1526.  
  1527.  
  1528.  
  1529. /*
  1530. Y軸(x=0)との衝突
  1531. ┃ ┃
  1532. ┃@┃
  1533. ┃ ┃
  1534. */
  1535. short    dir256_reflect_ay(in)
  1536. short    in;
  1537. {
  1538.     short    out;
  1539.  
  1540.     if( in==0 ){        out=128;    }
  1541.     else if( in==64 ){    out=192;    }    //ありえないけど
  1542.     else if( in==128 ){    out=0;        }
  1543.     else if( in==192 ){    out=64;        }    //こいつもありえないけど
  1544. //
  1545.     else if(   1<=in && in<= 63 ){    out=128-in;        }    //3
  1546.     else if(  65<=in && in<=127 ){    out=128-in;        }    //1
  1547.     else if( 129<=in && in<=191 ){    out=256-(in-128);    }    //7
  1548.     else if( 193<=in && in<=255 ){    out=128+(256-in);    }    //9
  1549.     
  1550.     return(out);
  1551. }
  1552.  
  1553.  
  1554.  
  1555. /*
  1556. X軸(y=0)との衝突
  1557. ━━━
  1558.  @
  1559. ━━━
  1560. */
  1561. short    dir256_reflect_ax(in)
  1562. short    in;
  1563. {
  1564.     short    out;
  1565.  
  1566.     if( in==0 ){        out=128;    }    //ありえないけど
  1567.     else if( in==64 ){    out=192;    }
  1568.     else if( in==128 ){    out=0;        }    //こいつもありえないけど
  1569.     else if( in==192 ){    out=64;        }
  1570. //
  1571.     else if(   1<=in && in<= 63 ){    out=256-in;        }
  1572.     else if(  65<=in && in<=127 ){    out=128+(128-in);    }
  1573.     else if( 129<=in && in<=191 ){    out= 64+(191-in);    }
  1574.     else if( 193<=in && in<=255 ){    out= 64-(in-192);    }
  1575.     
  1576.     return(out);
  1577. }
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584. ////////////////////////////////////////////////////////////////////////////////
  1585. //                               よく使われるタスク
  1586. ////////////////////////////////////////////////////////////////////////////////
  1587. int    ANIMONLY_JOB(t)
  1588. TASK    *t;
  1589. {
  1590.     SPINFO    *s;
  1591.     s=t->disp0_addr;
  1592.  
  1593.     t->disp0_anim++;
  1594.     if( t->disp0_anim>=s->max_anim ){
  1595.         ETaskFree(t);
  1596.     }
  1597.     
  1598. quick_exit:;
  1599.     return(0);
  1600. }
  1601.  
  1602.  
  1603. int    LOOPANIM_JOB(t)
  1604. TASK    *t;
  1605. {
  1606.     SPINFO    *s;
  1607.     s=t->disp0_addr;
  1608.  
  1609.     t->disp0_anim++;
  1610.     if( t->disp0_anim>=s->max_anim ){
  1611.         t->disp0_anim=0;
  1612.     }
  1613.     
  1614. quick_exit:;
  1615.     return(0);
  1616. }
  1617.  
  1618.  
  1619. int    NOP_JOB(t)
  1620. TASK    *t;
  1621. {
  1622.     return(0);
  1623. }
  1624.  
  1625.  
  1626. /*
  1627.     1ドット自機弾専用タスク
  1628. */
  1629. int    PLAYERSHT_JOB(t)
  1630. PSTASK    *t;
  1631. {
  1632.     SPINFO    *s;
  1633.     s=t->disp0_addr;
  1634.     
  1635.     t->disp0_x+=t->disp0_vx;    //弾移動
  1636.     t->disp0_y+=t->disp0_vy;
  1637.     
  1638.     if(                //画面アウトチェック
  1639.     ( t->disp0_x<0 ) || ( t->disp0_y<0 ) ||
  1640.     ( t->disp0_x>(256<<16) ) || ( t->disp0_y>(256<<16) )
  1641.     ){
  1642.         PSTaskFree(t);
  1643.         goto quick_exit;
  1644.     }
  1645.     
  1646. quick_exit:
  1647.     return(0);
  1648. }
  1649.  
  1650.  
  1651.  
  1652. /*
  1653.     1ドット敵弾専用タスク
  1654. */
  1655. int    ENEMYSHT_JOB(t)
  1656. ESTASK    *t;
  1657. {
  1658.     SPINFO    *s;
  1659.     s=t->disp0_addr;
  1660.     
  1661.     t->disp0_x+=t->disp0_vx;    //敵弾移動
  1662.     t->disp0_y+=t->disp0_vy;
  1663.     
  1664.     if(
  1665.     ( t->disp0_x<0 ) || ( t->disp0_y<0 ) ||
  1666.     ( t->disp0_x>(256<<16) ) || ( t->disp0_y>(256<<16) )
  1667.     ){
  1668.         ESTaskFree(t);
  1669.         goto quick_exit;
  1670.     }
  1671.     
  1672.     t->disp0_anim++;        //アニメ更新
  1673.     if( t->disp0_anim>=s->max_anim ){
  1674.         t->disp0_anim=0;
  1675.     }
  1676.     
  1677. quick_exit:
  1678.     return(0);
  1679. }
  1680.  
  1681.  
  1682.  
  1683.  
  1684.  
  1685.  
  1686.  
  1687. /* [ EOF ] */
  1688.  
  1689.  
  1690.